package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import to.SolicitacaoDeAnalise;
import to.SolicitacaoDeterminacao;
import util.HibernateUtil;
import visao.AmostraVO;
import visao.ElementoAmostraVO;
import visao.RecomendacaoVO;

public class RecomendacaoDAO {

	public List<SolicitacaoDeterminacao> buscarTodas() throws Exception {

		List<SolicitacaoDeterminacao> listaRetorno = null;

		try {

			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(
					SolicitacaoDeterminacao.class, "sd");
			criteria.setProjection(Projections.property("sd.amostra"));

			criteria.createAlias("solicitacao", "s");
			criteria.createAlias("amostra", "a");
			criteria.addOrder(Order.asc("s.codigo"));
			criteria.add(Restrictions.like("s.status", "%Finalizada%"));
			criteria.add(Restrictions.like("a.recomendacaoSolicitada", "%Sim%"));
			listaRetorno = (List<SolicitacaoDeterminacao>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;

	}

	public List<RecomendacaoVO> buscarSolicitacaoRecomendacao() {

		StringBuilder sql = new StringBuilder();

		sql.append("select DISTINCT s.codigo, s.dataEntrada, s.dataSaida, s.`status`, p.nome from solicitacaodeterminacao sd, amostra a, ");
		sql.append("solicitacaodeanalise s, pessoa p where a.recomendacaoSolicitada = 'Sim' and s.`status` = 'Analise Finalizada' ");
		sql.append("and s.codigo = sd.solicitacao_codigo and sd.id_amostra = a.codigo and p.codigo = s.id_pessoa ");

		List<RecomendacaoVO> listaRetorno = new ArrayList<RecomendacaoVO>();

		try {

			Connection conexao = HibernateUtil.getSessionFactory()
					.openSession().connection();
			PreparedStatement comando = conexao
					.prepareStatement(sql.toString());
			ResultSet resultado = comando.executeQuery();

			while (resultado.next()) {

				RecomendacaoVO rec = new RecomendacaoVO();

				rec.setIdSolicitacao(resultado.getInt("s.codigo"));
				rec.setDataEntrada(resultado.getObject("s.dataEntrada"));
				rec.setDataSaida(resultado.getObject("s.dataSaida"));
				rec.setStatus(resultado.getObject("s.status"));
				rec.setNome(resultado.getObject("p.nome"));

				listaRetorno.add(rec);

			}

			conexao.close();

		} catch (Exception e) {

			e.printStackTrace();

		}

		return listaRetorno;

	}

	public List<AmostraVO> buscarAmostraPorSolicitacao(Integer solicitacao) {

		StringBuilder sql = new StringBuilder();

		sql.append("select distinct a.codigo, ir.resultado_codigo, a.cultura, a.profundidade, p.nome, a.gleba, ir.ctc, ir.hAL,ir.pH, ir.sB, ir.satAL, ir.satCA, ir.satK, ir.satMG, ir.vPorCento ");
		sql.append("from amostra a, itemresultado ir, resultado r,propriedade p, solicitacaodeanalise s where ");
		sql.append("ir.amostra_codigo = a.codigo ");
		sql.append("and r.codigo = ir.resultado_codigo and p.codigo = a.propriedade_codigo ");
		sql.append("and s.codigo = r.id_socilicitacaoDeAnalise and a.recomendacaoSolicitada = 'Sim' and a.Status = 'Analise Finalizada' and s.codigo = "
				+ solicitacao);

		List<AmostraVO> listaRetorno = new ArrayList<AmostraVO>();

		try {

			Connection conexao = HibernateUtil.getSessionFactory()
					.openSession().connection();
			PreparedStatement comando = conexao
					.prepareStatement(sql.toString());
			ResultSet resultado = comando.executeQuery();

			while (resultado.next()) {

				AmostraVO linha = new AmostraVO();

				linha.setCodAmostra(resultado.getInt("a.codigo"));
				linha.setCodResultado(resultado.getInt("ir.resultado_codigo"));
				linha.setCultura(resultado.getObject("a.cultura"));
				linha.setProfundidade(resultado.getObject("a.profundidade"));
				linha.setPropriedade(resultado.getObject("p.nome"));
				linha.setGleba(resultado.getObject("a.gleba"));
				linha.setCtc(resultado.getObject("ir.ctc"));
				linha.sethAl(resultado.getObject("ir.hAL"));
				linha.setpH(resultado.getObject("ir.pH"));
				linha.setsB(resultado.getObject("ir.sB"));
				linha.setSatAl(resultado.getObject("ir.satAL"));
				linha.setSatCa(resultado.getObject("ir.satCA"));
				linha.setSatK(resultado.getObject("ir.satK"));
				linha.setSatMg(resultado.getObject("ir.satMG"));
				linha.setvPorcento(resultado.getObject("ir.vPorCento"));

				listaRetorno.add(linha);
			}

			conexao.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

	public List<ElementoAmostraVO> buscarElementoPorAmostra(Integer solicitacao) {

		StringBuilder sql = new StringBuilder();

		sql.append("select a.codigo, e.codigo as idElemento, ir.media from amostra a, elemento e, itemresultado ir, solicitacaodeanalise s, resultado r ");
		sql.append("where e.codigo = ir.elemento_codigo and a.codigo = ir.amostra_codigo and s.codigo = r.id_socilicitacaoDeAnalise ");
		sql.append("and r.codigo = ir.resultado_codigo and s.codigo = "
				+ solicitacao);

		List<ElementoAmostraVO> listaRetorno = new ArrayList<ElementoAmostraVO>();

		try {

			Connection conexao = HibernateUtil.getSessionFactory()
					.openSession().connection();
			PreparedStatement comando = conexao
					.prepareStatement(sql.toString());
			ResultSet resultado = comando.executeQuery();

			while (resultado.next()) {

				ElementoAmostraVO linha = new ElementoAmostraVO();

				linha.setCodAmostra(resultado.getInt("a.codigo"));
				linha.setCodElemento(resultado.getInt("idElemento"));
				linha.setMedia(resultado.getObject("ir.media"));

				listaRetorno.add(linha);
			}

			conexao.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

}
